using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

/// <summary>
/// Summary description for CuentasBD
/// </summary>
public class CuentasBD
{	
	//constructor de cuentas
	public CuentasBD()
	{
		//
		// TODO: Add constructor logic here
		//
	}
	
	//Consulta de Cuentas para cargar el grid, obtengo id, usuario de la cuenta y nombre de empleado
    public DataTable ConsultarCuentas()
    {

        DataTable resultados = new DataTable();
        SqlDataAdapter adpCuentas = new SqlDataAdapter();
		
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando a ejecutar!
            SqlCommand cmd = new SqlCommand("Select c.id, c.usuario, e.nombre from Cuentas c join Empleados e on c.CedulaEmp = e.cedula");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            adpCuentas.SelectCommand = cmd;
            adpCuentas.Fill(resultados);
        }

        return resultados;
    }

	//consulta especifica de todos los datos de una cuenta
    public CuentasEnt ConsultarCuenta(int id)
    {
        CuentasEnt resultado = null;
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando de consulta de cuenta a ejecutar
            SqlCommand cmd =
                new SqlCommand("Select c.id, c.usuario, e.nombre, c.contrasena, c.perfil from Cuentas c join Empleados e on c.CedulaEmp = e.cedula where c.id = @id");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@id", id));//especificacion del parametro
															//Para consultar

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultado = this.ObtenerCuenta(dr); //obtengo la entidad de cuentas
            }
        }
        return resultado;
    }
	
	//Consulta de cuenta para el login al sistema
    public CuentasEnt ConsultarCuenta(string usuario, string password)
    {
        CuentasEnt resultado = null;
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			// especifico el comando a ejecutar
            SqlCommand cmd =
                new SqlCommand("Select c.id, c.usuario, e.nombre, c.contrasena, c.perfil from Cuentas c join Empleados e on c.CedulaEmp = e.cedula where c.usuario = @usuario AND c.contrasena = @password");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
			//le agrego los parametros
            cmd.Parameters.Add(new SqlParameter("@usuario", usuario));
            cmd.Parameters.Add(new SqlParameter("@password", password));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultado = this.ObtenerCuenta(dr); //obtengo la entidad de perfil
            }
        }
        return resultado;
    }

	//leer tupla correspondiente a la cuenta
    private CuentasEnt ObtenerCuenta(SqlDataReader dr)
    {
        CuentasEnt resultado = null;

        if (dr.HasRows)	//si existen tuplas
        {
            dr.Read();
			//obtengo los datos de la cuenta
            int colId = dr.GetOrdinal("Id");
            int colNombre = dr.GetOrdinal("Nombre");
            int colContrasena = dr.GetOrdinal("contrasena");
            int colPerfil = dr.GetOrdinal("Perfil");
            int colUsuario = dr.GetOrdinal("Usuario");

            object[] valores = new object[dr.FieldCount];
            dr.GetValues(valores);
			
			//casteo todos los valores obtenidos
            int id = (int)valores[colId];
            string nombre = (string)valores[colNombre];
            string perfil = (string)valores[colPerfil];
            string contrasena = (string)valores[colContrasena];
            string usuario = (string)valores[colUsuario];
			
			//creo la entidad con estos valores
            resultado = new CuentasEnt(id, usuario, contrasena, perfil, nombre);
        }
        return resultado;
    }

	//Metodo de insercion de una cuenta en la base de datos
    public bool InsertarCuenta(CuentasEnt Cuenta)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando conection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaro el comando de insercion a ejecutar
                SqlCommand cmd = new SqlCommand("Insert Cuentas(usuario,contrasena,perfil,cedulaEmp) select @usuario,@contrasena,@perfil,(select cedula from Empleados where nombre = @nombre)");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego todos los parametro correspondientes a datos de la cuenta
                cmd.Parameters.Add(new SqlParameter("@usuario", Cuenta.Usuario));
                cmd.Parameters.Add(new SqlParameter("@contrasena", Cuenta.Contrasena));
                cmd.Parameters.Add(new SqlParameter("@perfil", Cuenta.Perfil));
                cmd.Parameters.Add(new SqlParameter("@nombre", Cuenta.Nombre));
                
               
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //si no se pudo conectar o la consulta dio error, devuelva falso 
        }

        return resultado;
    }

	//elimina una cuentas de la base de datos, recibe el id de la cuenta
    public bool EliminarCuenta(int id)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand("Delete from Cuentas where id = @id");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@id", id));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }
	//Metodo de actualizacion de los datos de una cuenta
    public bool ActualizarCuenta(CuentasEnt Cuenta)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaracion del comando de modificacion
                SqlCommand cmd =
                    new SqlCommand("Update Cuentas set contrasena = @contrasena, perfil = @perfil where id = @id");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego los parametros a la consulta
                cmd.Parameters.Add(new SqlParameter("@id", Cuenta.Id));
                cmd.Parameters.Add(new SqlParameter("@contrasena", Cuenta.Contrasena));
                cmd.Parameters.Add(new SqlParameter("@perfil", Cuenta.Perfil));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelvo falso si no se logro conectar o hubo un error
        }

        return resultado;
    }
}
